#include <iostream>
#include <string>
#include <vector>
#include <utility>

// C++14前的写法：需要指定返回类型
template<typename T, typename U>
auto add_old(T t, U u) -> decltype(t + u) {
    return t + u;
}

// C++14: 自动推导返回类型
template<typename T, typename U>
auto add_new(T t, U u) {
    return t + u;
}

// 在复杂表达式中也适用
double calculate(int x, int y) {
    if (x > 0)
        return x * y;  // 返回int，隐式转换为double
    else
        return x * 1.5; // 返回double
}

void demonstrate_auto_return_type() {
    // 基本演示
    std::cout << "  add_old(5, 3.5) = " << add_old(5, 3.5) << '\n';
    std::cout << "  add_new(5, 3.5) = " << add_new(5, 3.5) << '\n';
    
    // 各种类型组合
    std::cout << "  add_new(42, 3.14) = " << add_new(42, 3.14) << '\n';
    std::cout << "  add_new(std::string(\"Hello\"), \" World\") = " 
              << add_new(std::string("Hello"), " World") << '\n';
              
    // 条件返回
    std::cout << "  calculate(5, 2) = " << calculate(5, 2) << '\n';
    std::cout << "  calculate(-5, 2) = " << calculate(-5, 2) << '\n';
} 